package com.uzai.console.service.wxqaddfriend.impl;

import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.uzai.common.enums.DeviceTypeEnum;
import com.uzai.common.enums.KefuSendMsgEnum;
import com.uzai.common.enums.MessageFuncEnum;
import com.uzai.common.enums.MessageTypeEnum;
import com.uzai.common.exception.BusinessException;
import com.uzai.common.msg.MsgDto;
import com.uzai.common.msg.NoticeMsgDto;
import com.uzai.common.result.ResponseCode;
import com.uzai.console.common.ResponseMsg;
import com.uzai.console.common.utils.DateUtil;
import com.uzai.console.constant.Const;
import com.uzai.console.dto.device.DeviceQuery;
import com.uzai.console.dto.wxqaddfriend.wxqaddfriendtask.WxqAddFriendTaskDto;
import com.uzai.console.dto.wxqaddfriend.wxqaddfriendtask.WxqAddFriendTaskIdDto;
import com.uzai.console.dto.wxqaddfriend.wxqaddfriendtask.WxqAddFriendTaskQuery;
import com.uzai.console.entity.Device;
import com.uzai.console.entity.WxqAddFriendTask;
import com.uzai.console.enums.WxqAddFriendTaskStatusEnum;
import com.uzai.console.mapper.WxqAddFriendTaskAddInfoMapper;
import com.uzai.console.mapper.WxqAddFriendTaskMapper;
import com.uzai.console.service.device.DeviceService;
import com.uzai.console.service.rocketmq.NoticeMsgPushProducerService;
import com.uzai.console.service.wxqaddfriend.WxqAddFriendTaskService;
import com.uzai.console.service.wxqaddfriend.WxqAddFriendTaskSyncService;
import com.uzai.console.vo.device.DeviceInfoVo;
import com.uzai.console.vo.wxqaddfriend.wxqaddfriendtask.WxqAddFriendTaskVo;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.List;

/**
 * 微信群添加好友任务
 * @author liuqi
 * @date 2021年08月13日 11:34
 */
@Service
public class WxqAddFriendTaskServiceImpl implements WxqAddFriendTaskService {

    Logger logger = LoggerFactory.getLogger(WxqAddFriendTaskServiceImpl.class);

    @Autowired
    private WxqAddFriendTaskMapper wxqAddFriendTaskMapper;
    @Autowired
    private DeviceService deviceService;
    @Autowired
    private WxqAddFriendTaskSyncService wxqAddFriendTaskSyncService;
    @Autowired
    private WxqAddFriendTaskAddInfoMapper wxqAddFriendTaskAddInfoMapper;
    @Autowired
    private NoticeMsgPushProducerService noticeMsgPushProducerService;

    /**
     * 查询微信群添加好友任务列表
     * @author liuqi
     * @date 2021/8/13 11:38
     * @param wxqAddFriendTaskQuery
     * @return null
     */
    public Page<WxqAddFriendTaskVo> findWxqAddFriendTaskList(WxqAddFriendTaskQuery wxqAddFriendTaskQuery){

        Integer now = DateUtil.getNowTime();

        //新建返回到页面的LIST对象
        List<WxqAddFriendTaskVo> wxqAddFriendTaskVoList = new ArrayList<>();

        //执行分页查询对象
        Page<WxqAddFriendTask> page = new Page<>();
        wxqAddFriendTaskQuery.convert(page);
        List<WxqAddFriendTask> wxqAddFriendTaskList = wxqAddFriendTaskMapper.findByList(page, wxqAddFriendTaskQuery);
        if(wxqAddFriendTaskList != null){
            for (WxqAddFriendTask wxqAddFriendTask : wxqAddFriendTaskList){
                WxqAddFriendTaskVo wxqAddFriendTaskVo = new WxqAddFriendTaskVo();
                BeanUtils.copyProperties(wxqAddFriendTask, wxqAddFriendTaskVo);

                //查询群发类型名称
                if(StringUtils.isNotBlank(wxqAddFriendTask.getDeviceType())){
                    DeviceTypeEnum deviceTypeEnum = DeviceTypeEnum.getByKey(wxqAddFriendTask.getDeviceType());
                    if(deviceTypeEnum != null){
                        wxqAddFriendTaskVo.setDeviceTypeName(deviceTypeEnum.getRemark());
                    }
                }

                //机器人信息
                if(wxqAddFriendTask.getDeviceUniqueId() != null){
                    Device device = deviceService.findDeviceInfoByDeviceUniqueId(wxqAddFriendTask.getDeviceUniqueId(), wxqAddFriendTask.getDeviceType(), wxqAddFriendTask.getMerId());
                    if(device != null){
                        wxqAddFriendTaskVo.setDeviceId(device.getDeviceId());
                        wxqAddFriendTaskVo.setDeviceName(device.getDeviceName());
                        wxqAddFriendTaskVo.setDeviceRemark(device.getDeviceRemark());
                    }
                }

                //状态名称
                if(wxqAddFriendTask.getStatus() != null){
                    WxqAddFriendTaskStatusEnum wxqAddFriendTaskStatusEnum = WxqAddFriendTaskStatusEnum.getById(wxqAddFriendTask.getStatus());
                    if(wxqAddFriendTaskStatusEnum != null){
                        wxqAddFriendTaskVo.setStatusName(wxqAddFriendTaskStatusEnum.getDesc());
                    }
                }

                //昵称排除备注列表
                if(StringUtils.isNotBlank(wxqAddFriendTask.getNickExclude())){
                    wxqAddFriendTaskVo.setNickExcludeList(JSONObject.parseArray(wxqAddFriendTask.getNickExclude(), String.class));
                }

                //wxid排除备注列表
                if(StringUtils.isNotBlank(wxqAddFriendTask.getWxidExclude())){
                    wxqAddFriendTaskVo.setWxidExcludeList(JSONObject.parseArray(wxqAddFriendTask.getWxidExclude(), String.class));
                }

                //查询未发送总数
                wxqAddFriendTaskVo.setAddNumNot(wxqAddFriendTaskAddInfoMapper.selectCount(wxqAddFriendTask.getId(), wxqAddFriendTask.getMerId()));

                wxqAddFriendTaskVoList.add(wxqAddFriendTaskVo);

            }
        }
        //返回到页面分页对象
        Page<WxqAddFriendTaskVo> pageVo = new Page<>();
        BeanUtils.copyProperties(page, pageVo);
        pageVo.setRecords(wxqAddFriendTaskVoList);
        //将分页信息复制到返回到页面的分页MO当中
        return pageVo;
    }

    /**
     * 查询微信群添加好友任务详情
     * @author liuqi
     * @date 2021/8/13 11:38
     * @param wxqAddFriendTaskIdDto
     * @return null
     */
    public WxqAddFriendTaskVo findWxqAddFriendTask(WxqAddFriendTaskIdDto wxqAddFriendTaskIdDto){
        //返回到页面的VO对象
        WxqAddFriendTaskVo wxqAddFriendTaskVo = new WxqAddFriendTaskVo();

        if(wxqAddFriendTaskIdDto.getId() == null){
            throw  new BusinessException(ResponseCode.BUSINESS_EXCEPTION, ResponseMsg.PARAM_ERROR);
        }

        WxqAddFriendTask wxqAddFriendTask = wxqAddFriendTaskMapper.selectById(wxqAddFriendTaskIdDto.getId(), wxqAddFriendTaskIdDto.getMerId());

        if(wxqAddFriendTask == null ){
            throw  new BusinessException(ResponseCode.BUSINESS_EXCEPTION, "该记录不存在");
        }

        //将查询到的数据复制到页面VO中
        BeanUtils.copyProperties(wxqAddFriendTask, wxqAddFriendTaskVo);

        //查询群发类型名称
        if(StringUtils.isNotBlank(wxqAddFriendTask.getDeviceType())){
            DeviceTypeEnum deviceTypeEnum = DeviceTypeEnum.getByKey(wxqAddFriendTask.getDeviceType());
            if(deviceTypeEnum != null){
                wxqAddFriendTaskVo.setDeviceTypeName(deviceTypeEnum.getRemark());
            }
        }

        //机器人信息
        if(wxqAddFriendTask.getDeviceUniqueId() != null){
            Device device = deviceService.findDeviceInfoByDeviceUniqueId(wxqAddFriendTask.getDeviceUniqueId(), wxqAddFriendTask.getDeviceType(), wxqAddFriendTask.getMerId());
            if(device != null){
                wxqAddFriendTaskVo.setDeviceId(device.getDeviceId());
                wxqAddFriendTaskVo.setDeviceName(device.getDeviceName());
                wxqAddFriendTaskVo.setDeviceRemark(device.getDeviceRemark());
            }
        }

        //状态名称
        if(wxqAddFriendTask.getStatus() != null){
            WxqAddFriendTaskStatusEnum wxqAddFriendTaskStatusEnum = WxqAddFriendTaskStatusEnum.getById(wxqAddFriendTask.getStatus());
            if(wxqAddFriendTaskStatusEnum != null){
                wxqAddFriendTaskVo.setStatusName(wxqAddFriendTaskStatusEnum.getDesc());
            }
        }

        //昵称排除备注列表
        if(StringUtils.isNotBlank(wxqAddFriendTask.getNickExclude())){
            wxqAddFriendTaskVo.setNickExcludeList(JSONObject.parseArray(wxqAddFriendTask.getNickExclude(), String.class));
        }

        //wxid排除备注列表
        if(StringUtils.isNotBlank(wxqAddFriendTask.getWxidExclude())){
            wxqAddFriendTaskVo.setWxidExcludeList(JSONObject.parseArray(wxqAddFriendTask.getWxidExclude(), String.class));
        }

        //查询未发送总数
        wxqAddFriendTaskVo.setAddNumNot(wxqAddFriendTaskAddInfoMapper.selectCount(wxqAddFriendTask.getId(), wxqAddFriendTask.getMerId()));

        return  wxqAddFriendTaskVo;
    }

    /**
     * 添加微信群添加好友任务
     * @author liuqi
     * @date 2021/8/13 11:38
     * @param wxqAddFriendTaskDto
     * @return null
     */
    public void addWxqAddFriendTask(WxqAddFriendTaskDto wxqAddFriendTaskDto){

        if(StringUtils.isBlank(wxqAddFriendTaskDto.getDeviceType())){
            throw  new BusinessException(ResponseCode.BUSINESS_EXCEPTION, "机器人类型不能为空");
        }

        if(wxqAddFriendTaskDto.getGroupIdList() == null || wxqAddFriendTaskDto.getGroupIdList().size() == 0){
            throw  new BusinessException(ResponseCode.BUSINESS_EXCEPTION, "请选择群");
        }

        if(StringUtils.isBlank(wxqAddFriendTaskDto.getName())){
            throw  new BusinessException(ResponseCode.BUSINESS_EXCEPTION, "请输入任务名称");
        }

        if(wxqAddFriendTaskDto.getRateMin() == null || wxqAddFriendTaskDto.getRateMax() == null){
            throw  new BusinessException(ResponseCode.BUSINESS_EXCEPTION, "请输入检查文本消息");
        }

        if(wxqAddFriendTaskDto.getAddDayMin() == null || wxqAddFriendTaskDto.getAddDayMax() == null){
            throw  new BusinessException(ResponseCode.BUSINESS_EXCEPTION, "请输入每天添加个数");
        }

        //循环机器人，依次建立每个机器人的添加好友任务
        if(wxqAddFriendTaskDto.getDeviceType().equals(DeviceTypeEnum.DT_PC_WECHAT.getKey())){
            wxqAddFriendTaskSyncService.addWxqAddFriendTaskByWechat(wxqAddFriendTaskDto);
        }else if(wxqAddFriendTaskDto.getDeviceType().equals(DeviceTypeEnum.DT_WORK_WECHAT.getKey())){
            wxqAddFriendTaskSyncService.addWxqAddFriendTaskByWxwork(wxqAddFriendTaskDto);
        }else{
            throw  new BusinessException(ResponseCode.BUSINESS_EXCEPTION, "自动添加好友任务目前只支持个人微信和企业微信");
        }
    }

    /**
     * 删除微信群添加好友任务
     * @author liuqi
     * @date 2021/8/13 11:38
     * @param wxqAddFriendTaskIdDto
     * @return null
     */
    @Transactional
    public void deleteWxqAddFriendTask(WxqAddFriendTaskIdDto wxqAddFriendTaskIdDto){

        if(wxqAddFriendTaskIdDto.getId() == null){
            throw  new BusinessException(ResponseCode.BUSINESS_EXCEPTION, ResponseMsg.PARAM_ERROR);
        }

        WxqAddFriendTask wxqAddFriendTask = wxqAddFriendTaskMapper.selectById(wxqAddFriendTaskIdDto.getId(), wxqAddFriendTaskIdDto.getMerId());

        if(wxqAddFriendTask == null ){
            throw  new BusinessException(ResponseCode.BUSINESS_EXCEPTION, "该记录不存在");
        }

        if(wxqAddFriendTask.getStatus().intValue() == WxqAddFriendTaskStatusEnum.INIT.getId().intValue()){
            throw  new BusinessException(ResponseCode.BUSINESS_EXCEPTION, "初始化中的任务不能删除");
        }

        //删除任务
        wxqAddFriendTaskMapper.deleteById(wxqAddFriendTask.getId(), wxqAddFriendTaskIdDto.getMerId());

        //删除微信群添加好友添加明细
        wxqAddFriendTaskAddInfoMapper.deleteByTaskId(wxqAddFriendTask.getId(), wxqAddFriendTaskIdDto.getMerId());

    }
}
